/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package managedbean;

import com.bean.GestionnaireDeUser;
import com.entities.Acheteur;
import com.entities.Produit;
import com.entities.Vendeur;
import com.ws.CallGoogleWS;
import java.io.IOException;
import java.io.Serializable;
import java.text.DecimalFormat;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import javax.ejb.EJB;
import javax.enterprise.context.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;
import javax.faces.context.Flash;
import javax.inject.Named;
import org.netbeans.saas.google.GoogleMapService;
import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortOrder;

/**
 *
 * @author mathieumiollan
 */
@ManagedBean(eager = true)
@Named(value = "userBean")
@SessionScoped
public class UserBean implements Serializable {
    @EJB
    private GestionnaireDeUser gestionnaireDeUser;
   
    
    private boolean acheteurConnected = false;
    private boolean vendeurConnected  = false;
    private LazyDataModel<Produit> lazyPanier = null;
    private Vendeur vendeurConnecte;
    private Acheteur acheteurConnecte;
    private Vendeur vendeurProfil;
    private String nom;
    private String prenom;
    private String adresse;
    private String magasin;
    private String description;
    private String password;
    private String login;
    private double[] coordAcheteur;
    
    private LazyDataModel<Produit> tousLesProduits = null;
    
    
    /**
     * Creates a new instance of UserBean
     */
    public UserBean() {
    }

    public GestionnaireDeUser getGestionnaireDeUser() {
        return gestionnaireDeUser;
    }

    

    public void setGestionnaireDeUser(GestionnaireDeUser gestionnaireDeUser) {
        this.gestionnaireDeUser = gestionnaireDeUser;
    }

    public boolean isAcheteurConnected() {
        return acheteurConnected;
    }

    public String getDescription() {
        return description;
    }

    public Acheteur getAcheteurConnecte() {
        return acheteurConnecte;
    }
    
    public LazyDataModel<Produit> getLazyPanier() {
        System.out.println("OKKKE");
        if(lazyPanier == null){
            lazyPanier = new LazyDataModel<Produit>() {

                @Override
                public List<Produit> load(int i, int i1, String string, SortOrder so, Map<String, String> map) {
                    System.out.println("CHARGEMENT");
                    List<Produit> lst = gestionnaireDeUser.getPanier(acheteurConnecte, i, i1);
                    System.out.println(lst.size());
                    this.setPageSize(i1);
                    this.setRowCount(lst.size());
                    return lst;                   
                }
            };
                    return lazyPanier;
        }else{
            return lazyPanier;
        }
    }
    public Collection<Produit> getPanier(){
        return acheteurConnecte.getPanier();
    }

    public Vendeur getVendeurProfil() {
        return vendeurProfil;
    }

    public void setVendeurProfil(Vendeur vendeurProfil) {
        this.vendeurProfil = vendeurProfil;
    }

    public void setAcheteurConnecte(Acheteur acheteurConnecte) {
        this.acheteurConnecte = acheteurConnecte;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getMagasin() {
        return magasin;
    }

    public void setMagasin(String magasin) {
        this.magasin = magasin;
    }

    public String getNom() {
        return nom;
    }

    public void setNom(String nom) {
        this.nom = nom;
    }

    public String getPrenom() {
        return prenom;
    }

    public void setPrenom(String prenom) {
        this.prenom = prenom;
    }

    public String getAdresse() {
        return adresse;
    }

    public void setAdresse(String adresse) {
        this.adresse = adresse;
    }

    public void setAcheteurConnected(boolean acheteurConnected) {
        this.acheteurConnected = acheteurConnected;
    }

    public boolean isVendeurConnected() {
        return vendeurConnected;
    }

    public void setVendeurConnected(boolean vendeurConnected) {
        this.vendeurConnected = vendeurConnected;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public Vendeur getVendeurConnecte() {
        return vendeurConnecte;
    }

    public void setVendeurConnecte(Vendeur vendeurConnecte) {
        this.vendeurConnecte = vendeurConnecte;
    }
  
    public String acheteur() {
        System.out.println("### ACCES INTERFACE ACHETEUR ###");
        return "acheteur?faces-redirect=true";    
    }
    
    public String connexionAcheteur(){
        System.out.println("### CONNEXION INTERFACE ACHETEUR ###");
        if(gestionnaireDeUser.connexionAcheteur(login, password)){
            acheteurConnected = true;
            acheteurConnecte = gestionnaireDeUser.getAcheteurByLogin(login);
            coordAcheteur = (new CallGoogleWS()).getDistance(acheteurConnecte.getAdresse());
            addFlashMessage(new FacesMessage(FacesMessage.SEVERITY_INFO, "Gestion des utilisateurs", "Vous êtes maintenant connecté."));   
        }
        else addFlashMessage(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Gestion des utilisateurs", "Ce couple login/password n'existe pas."));
        return "acheteur?faces-redirect=true";
    }
    
    public String connexionVendeur(){
        System.out.println("### CONNEXION INTERFACE VENDEUR ###");
        if(gestionnaireDeUser.connexionVendeur(login, password)){
            vendeurConnected = true;
            vendeurConnecte = gestionnaireDeUser.getVendeurByLogin(login);
            addFlashMessage(new FacesMessage(FacesMessage.SEVERITY_INFO, "Gestion des utilisateurs", "Vous êtes maintenant connecté."));
        }
        else addFlashMessage(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Gestion des utilisateurs", "Ce couple login/password n'existe pas."));
        return "vendeur?faces-redirect=true";
    }
    
    public String inscriptionAcheteur(){
        System.out.println("### INSCRIPTION INTERFACE ACHETEUR ###");
        gestionnaireDeUser.inscriptionAcheteur(nom, prenom, adresse, login, password);
        return connexionAcheteur();
    }
    
    
    public String inscriptionVendeur(){
        System.out.println("### INSCRIPTION INTERFACE VENDEUR ###");
        gestionnaireDeUser.inscriptionVendeur(nom, prenom, adresse, magasin, description, login, password);
        return connexionVendeur();
    }
    
    public String deconnexion(){
        System.out.println("### DECONNEXION ###");
        login = "";
        password = "";
        acheteurConnected = false;
        vendeurConnected = false;
        return "index?faces-redirect=true";
    }
    
    public String vendeur() {
        System.out.println("### ACCES INTERFACE VENDEUR ###");
        
        return "vendeur?faces-redirect=true";    
    }  
    
    public Collection<Produit>   getTouslesProduitsVendeur() {
        return vendeurConnecte.getMagasin().getProduits();
    }
    
    private void addFlashMessage(FacesMessage message) {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        Flash flash = facesContext.getExternalContext().getFlash();
        flash.setKeepMessages(true);
        flash.setRedirect(true);
        facesContext.addMessage(null, message);
    }
    
    public String showVendeur(Vendeur v){
        vendeurProfil = v;
        return "vendeurProfil?faces-redirect=true";
    }
    
    public String afficherMap() throws IOException{
        return CallGoogleWS.getGoogleMap(vendeurProfil.getAdresse());
    }
    
    public int getDistanceFromVendeur(String adrVendeur, String adrAcheteur){
        
        if (coordAcheteur == null) {
            coordAcheteur = (new CallGoogleWS()).getDistance(acheteurConnecte.getAdresse());
        }

        CallGoogleWS ws = new CallGoogleWS();
        double[] coordVendeur = ws.getDistance(adrVendeur);

        double theta = coordVendeur[1] - coordAcheteur[1];
        double dist = Math.sin(coordVendeur[0] * Math.PI / 180.0) * 
                Math.sin(coordAcheteur[0]* Math.PI / 180.0) + 
                Math.cos(coordVendeur[0] * Math.PI / 180.0) * 
                Math.cos(coordAcheteur[0] * Math.PI / 180.0) * 
                Math.cos(theta* Math.PI / 180.0);
        dist = Math.acos(dist);
        dist = dist* 180 / Math.PI;
        dist = dist * 60 * 1.1515;
        dist = dist * 1.609344;
        

        return (int)dist;
    }
    
}
